package com.example.syssoft.service;

import com.example.syssoft.common.service.LogicService;
import com.example.syssoft.config.Result;
import com.example.syssoft.dao.BusinessDao;
import com.example.syssoft.dao.CustomerDao;
import com.example.syssoft.dao.OrderDao;
import com.example.syssoft.dao.ShopDao;
import com.example.syssoft.domain.*;
import com.example.syssoft.domain.dto.LineItemDto;
import com.example.syssoft.domain.dto.OrderDto;
import com.example.syssoft.domain.dto.ShopDto;
import org.aspectj.asm.IModelFilter;
import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.jaxb.SpringDataJaxb;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;


@Service
public class CustomerService extends LogicService<CustomerDao, Customer,Long> {
    @Resource
    OrderDao orderDao;

    @Resource
    ShopDao shopDao;

    public CustomerService(CustomerDao lr) {
        super(lr);
    }

    @Transactional
    public Result addOrder(Long customerId,Long shopId,Double totalPrice, List<LineItem> list){

        Customer customer = getDAO().findById(customerId).get();
        Order order = new Order();
        order.setCustomer(customer);
        Shop shop = shopDao.findById(shopId).get();
        List<LineItem> newList = new ArrayList<>();
        if(list!=null){
            for (int i = 0; i <list.size() ; i++) {
                list.get(i).setOrder(order);
                newList.add(list.get(i));
            }
        }

        order.setLineItems(newList);
        order.setPayState(0);
        order.setState(0);
        order.setTotalPrice(totalPrice);
        order.setShop(shop);
        customer.addOrder(order);
        Customer save = getDAO().save(customer);
        if(save == null)
            return new Result("保存失败");
        return new Result(true,save.getOrders().get(save.getOrders().size()-1));
    }

    @Transactional
    public Result payState(Long orderId){
        Order orderById = orderDao.findOrderById(orderId);
        orderById.payOrder();
        return new Result(true,orderById);
    }

    public Result getOrder(Long customerId , Long shopId){
        Shop shop = new Shop();
        shop.setId(shopId);
        Customer customer = new Customer();
        customer.setId(customerId);
        List<OrderDto> orderDtos = new ArrayList<>();
        List<Order> res = orderDao.findOrderByShopAndAndCustomerAndPayState(shop, customer,0);
        List<LineItemDto> lineItemDto = new ArrayList<>();
        for (int i = 0; i <res.size() ; i++) {
            OrderDto dto = new OrderDto();
            for (int j = 0; j <res.get(i).getLineItems().size() ; j++) {
                LineItemDto itemDto = new LineItemDto();
                itemDto.setItemName(res.get(i).getLineItems().get(j).getItem().getName());
                itemDto.setTotalPrice(res.get(i).getLineItems().get(j).getTotalPrice());
                itemDto.setCount(res.get(i).getLineItems().get(j).getCount());
                itemDto.setId(res.get(i).getLineItems().get(j).getId());

                lineItemDto.add(itemDto);
            }
            BeanUtils.copyProperties(res.get(i),dto);
            dto.setLineItemDto(lineItemDto);
            orderDtos.add(dto);
        }


//        dto.setLineItems(null);
        if(res==null)
            return new Result("无订单");
        else
            return new Result(true,orderDtos);
    }

    public Result getAllOrder(Long customerId){
        Customer customer = new Customer();
        customer.setId(customerId);
        List<OrderDto> orderDtos = new ArrayList<>();
        List<Order> res = orderDao.findOrderByCustomer(customer);
        List<LineItemDto> lineItemDto = new ArrayList<>();
        for (int i = 0; i <res.size() ; i++) {
            OrderDto dto = new OrderDto();
            for (int j = 0; j <res.get(i).getLineItems().size() ; j++) {
                LineItemDto itemDto = new LineItemDto();
                itemDto.setItemName(res.get(i).getLineItems().get(j).getItem().getName());
                itemDto.setTotalPrice(res.get(i).getLineItems().get(j).getTotalPrice());
                itemDto.setCount(res.get(i).getLineItems().get(j).getCount());
                itemDto.setId(res.get(i).getLineItems().get(j).getId());
                lineItemDto.add(itemDto);
            }

            BeanUtils.copyProperties(res.get(i),dto);
            dto.setLineItemDto(lineItemDto);
            dto.setShopName(res.get(i).getShop().getName());
            orderDtos.add(dto);
        }


//        dto.setLineItems(null);
        if(res==null)
            return new Result("无订单");
        else
            return new Result(true,orderDtos);
    }

    public Result getOrderByPayState(Long customerId,Integer payState){
        Customer customer = new Customer();
        customer.setId(customerId);
        List<OrderDto> orderDtos = new ArrayList<>();
        List<Order> res = orderDao.findOrderByCustomerAndPayState(customer,payState);
        List<LineItemDto> lineItemDto = new ArrayList<>();
        for (int i = 0; i <res.size() ; i++) {
            OrderDto dto = new OrderDto();
            for (int j = 0; j <res.get(i).getLineItems().size() ; j++) {
                LineItemDto itemDto = new LineItemDto();
                itemDto.setItemName(res.get(i).getLineItems().get(j).getItem().getName());
                itemDto.setTotalPrice(res.get(i).getLineItems().get(j).getTotalPrice());
                itemDto.setCount(res.get(i).getLineItems().get(j).getCount());
                itemDto.setId(res.get(i).getLineItems().get(j).getId());
                lineItemDto.add(itemDto);
            }

            BeanUtils.copyProperties(res.get(i),dto);
            dto.setLineItemDto(lineItemDto);
            dto.setShopName(res.get(i).getShop().getName());
            orderDtos.add(dto);
        }


//        dto.setLineItems(null);
        if(res==null)
            return new Result("无订单");
        else
            return new Result(true,orderDtos);
    }

    public Result getOrderByState(Long customerId,Integer state,Integer payState){
        Customer customer = new Customer();
        customer.setId(customerId);
        List<OrderDto> orderDtos = new ArrayList<>();
        List<Order> res = orderDao.findOrderByCustomerAndStateAndPayState(customer,state,payState);
        List<LineItemDto> lineItemDto = new ArrayList<>();
        for (int i = 0; i <res.size() ; i++) {
            OrderDto dto = new OrderDto();
            for (int j = 0; j <res.get(i).getLineItems().size() ; j++) {
                LineItemDto itemDto = new LineItemDto();
                itemDto.setItemName(res.get(i).getLineItems().get(j).getItem().getName());
                itemDto.setTotalPrice(res.get(i).getLineItems().get(j).getTotalPrice());
                itemDto.setCount(res.get(i).getLineItems().get(j).getCount());
                itemDto.setId(res.get(i).getLineItems().get(j).getId());
                lineItemDto.add(itemDto);
            }

            BeanUtils.copyProperties(res.get(i),dto);
            dto.setLineItemDto(lineItemDto);
            dto.setShopName(res.get(i).getShop().getName());
            orderDtos.add(dto);
        }


//        dto.setLineItems(null);
        if(res==null)
            return new Result("无订单");
        else
            return new Result(true,orderDtos);
    }

    public Result getOrderById(Long orderId){
        Order res = orderDao.findOrderById(orderId);
        List<LineItemDto> lineItemDto = new ArrayList<>();
        OrderDto dto = new OrderDto();
        for (int j = 0; j <res.getLineItems().size() ; j++) {
            LineItemDto itemDto = new LineItemDto();
            itemDto.setItemName(res.getLineItems().get(j).getItem().getName());
            itemDto.setTotalPrice(res.getLineItems().get(j).getTotalPrice());
            itemDto.setCount(res.getLineItems().get(j).getCount());
            itemDto.setId(res.getLineItems().get(j).getId());
            lineItemDto.add(itemDto);
        }

        BeanUtils.copyProperties(res,dto);
        dto.setLineItemDto(lineItemDto);
        dto.setShopName(res.getShop().getName());
        dto.setCustomerName(res.getCustomer().getName());
        return new Result(true,dto);
    }
}
